<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <div>哈哈哈哈或或或</div>
    <div>哈哈哈哈或或或</div>
    <span>哈哈哈哈或或或</span>
    <span>哈哈哈哈或或或</span>
    <span>哈哈哈哈或或或</span>
    <div>哈哈哈哈或或或</div>
    <div>哈哈哈哈或或或</div>
    <a href="">哈哈哈哈或或或</a>
    <a href="">哈哈哈哈或或或</a>
    <a href="">哈哈哈哈或或或</a>
    <a href="">哈哈哈哈或或或</a>
    <div>哈哈哈哈或或或</div>
    <div>哈哈哈哈或或或</div>

<script src="jquery-3.1.0.js"></script>
<script>
    (function(){
        function map ( array, callback ) {
            var i, k,
                    res = [],
                    tmp;
            if ( isArrayLike( array ) ) {
                // 使用 for 循环
                for ( i= 0; i < array.length; i++ ) {
                    tmp = callback( array[ i ], i );
                    if ( tmp !== undefined ) {
                        res.push( tmp );
                    }
                }
            } else {
                // 使用 for-in 循环
                for ( k in array ) {
                    tmp = callback( array[ k ], k );
                    if ( tmp !== undefined ) {
                        res.push( tmp );
                    }
                }
            }
            return res;
        }

        function isArrayLike (array){

            var length = array && array.length;
            return typeof length === "number" && length >=0;
        };
        function each ( array, callback ) {
            var i, k;
            if ( isArrayLike( array ) ) {
                // 使用 for 循环
                for ( i= 0; i < array.length; i++ ) {
                    if( callback.call( array[ i ], i, array[ i ] ) === false ) break;
                    // if( callback.apply( array[ i ],[ i, array[ i ]] ) === false ) break;
                }
            } else {
                // 使用 for-in 循环
                for ( k in array ) {
                    if( callback.call( array[ i ], k , array[ k ] ) === false ) break;
                }
            }
            return array;
        }

        //定义Itcast构造函数
        //利用构造函数对象 即获得页面中的元素（即 参数是选择器）
        //对象应该是一个维数组，
        //该对象还需要提供方法
        function select(selector){
            return document.querySelectorAll( selector );
        }

        function Itcast(selector){
            //初始化this是伪数组

            var list = select(selector);
            this.length=0;
            [].push.apply(this,list);//讲lst中每个元素一一加到this中并且会自增length属性

            //return this 可加可不加 默认返回this
        }
        function I(selector){
            return new Itcast(selector);
        }
        Itcast.prototype = {
            //添加方法
            constructor:Itcast,
            each:function(callback){
                each(this,callback);
            },
            map:function(callback){
                map(this,callback);
            }
        }

        window.I=I;
//        window.Itcast=Itcast;
        I.Itcast=Itcast;
    })();
    I( 'div,span').each(function(){
        this.style.border = '1px dashed red';
    })



</script>
</html>